package com.lance.answer.gui.answer.gk.answer.lms.batch.task;

import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson.serializer.SerializerFeature;
import com.google.common.base.Strings;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import com.google.common.collect.Sets;
import com.lance.answer.dto.CompleteInfo;
import com.lance.answer.gui.answer.Util;
import com.lance.answer.gui.answer.gk.answer.lms.batch.dto.LmsWatchDTO;
import com.lance.answer.gui.answer.gk.answer.lms.util.LmsUtil;
import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.io.FileUtils;
import org.apache.commons.io.IOUtils;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.support.ui.Select;

import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.LinkedBlockingDeque;
import java.util.concurrent.TimeUnit;


@Slf4j
public class DoSheHuiShiJianTask extends Thread {


    public static ExecutorService pool = Executors.newSingleThreadExecutor();

    private final String driverPath;
    private final LinkedBlockingDeque<LmsWatchDTO> watchDTOS;

    public DoSheHuiShiJianTask(String driverPath, LinkedBlockingDeque<LmsWatchDTO> watchDTOS) {
        this.driverPath = driverPath;
        this.watchDTOS = watchDTOS;
    }

    @SneakyThrows
    @Override
    public void run() {

        while (watchDTOS.size() > 0) {
            LmsWatchDTO lmsWatchDTO = watchDTOS.take();
            String userName = lmsWatchDTO.getUsername();
            String password = lmsWatchDTO.getPassword();
            log.info("任务：{} 剩余 {} 行 用户名：{} 密码：{} 课程：{}",
                    Thread.currentThread().getName(), watchDTOS.size(), userName, password,lmsWatchDTO.getCourseName());
            System.err.println("执行任务11111");
            run(driverPath, lmsWatchDTO);
        }

        if (watchDTOS.size() == 0) {
            log.info("课程所有用户均已执行完毕，系统将在20min后结束");
            TimeUnit.MINUTES.sleep(20);
            return;
        }
    }


    // 完型填空类型
    public static final String CLOZE = "subject ng-scope cloze";

    public static void run(String driverPath, LmsWatchDTO lmsWatchDTO) throws Exception {


        ChromeDriver driver = Util.getDriver(driverPath);
        try {
            String url = "https://menhu.pt.ouchn.cn/site/ouchnPc/index";
            driver.get(url);
            Thread.sleep(3000);

            String userName = lmsWatchDTO.getUsername();
            String pwd = lmsWatchDTO.getPassword();


            //  pool.submit(() -> LmsUtil.login(driver, userName, pwd));
            LmsUtil.login(driver, userName, pwd);

            TimeUnit.SECONDS.sleep(3);

            // 要求分数 FIXME 每个课程要求的分数不一样


            Map<Long, String> courseMap = lmsWatchDTO.getCourseMap();


            for (Long courseId : courseMap.keySet()) {
                // 这里只看 大作业
                String courseName = courseMap.get(courseId);
                log.info("开始答题.........{}",courseName);
                study(driver, userName, courseName,lmsWatchDTO.getTeacher());

            }

        } catch (Exception e) {

        } finally {
            try {
                driver.close();
                driver.quit();
            } catch (Exception e1) {

            }
        }
    }


    private static void study(WebDriver driver, String userName, String subjectName,String teacherName) throws Exception {

        Map<String,String> answers = Maps.newHashMap();
        answers.put("形势与政策","一习近平法治思想的核心要义\n" +
                "习近平法制思想从我国革命建设改革的伟大实践出发，着眼全面建设社会主义现代化国家、实现中华民族伟大复兴的奋斗目标，深刻回答了新时代为什么实行全面依法治国、怎样实行全面依法治国的一系列重大问题，是一个内涵丰富、论述深刻、逻辑严密、体系完备、博大精深的法制思想理论体系。概括起来，其核心要义如下。\n" +
                "坚持党对全面依法治国的领导，是中国特色社会主义法治的本质特征和内在要求。党政军民学、东西南北中，党是领导一切的。中国共产党的领导是中国特色社会主义最本质的特征，是社会主义法治最根本的保证，是社会主义法治之魂。全面依法治国绝不是要削弱党的领导，而是要加强和改善党的领导，不断提升党领导依法治国的能力和水平，巩固党的执政地位。必须推进党的领导制度化、法制化，不断完善党的领导体制和工作机制，把党的领导贯彻到全面依法治国全过程的各方面，具体落实到党领导立法、保证执法、支持司法、带头守法的各环节。\n" +
                "坚持以人民为中心，是全面推进依法治国的力量源泉。人民是国家的主人。，依法治国的主体。社会主义法制建设必须为了人民、依靠人民、造福人民、保护人民。人民幸福生活是最大的人权。推进全面依法治国，根本目的是依法保障人民权益。要依法保障全体公民享有广泛的权利，保障公民的人身权、财产权、基本政治权利等各项权利不受侵犯。，保证公民的经济、文化、社会等各方面权利得到落实，不断增强人民群众获得感、幸福感、安全感，用法制保障人民安居乐业。公平正义是我们党追求的崇高价值。要牢牢把握社会公平正义这一法治价值追求，努力让人民群众在每一项法律制度、每一个执法决定、美誉中司法案件中都感受到公平正义。\n" +
                "坚持中国特色社会主义法治道路，是全面推进依法治国的发展道路和正确方向。道路决定命运。，道路决定前途。中国特色社会主义法治道路本质上是中国社会主义道路在法制领域的具体体现。全面推进依法治国必须走对路。我们既不走封闭僵化的老路，也不走改旗易帜的邪路，而要从中国国情和实际出发，传承中华优秀传统法律文化。，从我国革命、建设、改革的实践中，探索适合自己的法治道路，为全面建设社会主义现代化国家、实现中华民族伟大复兴夯实法治基础。我们要学习借鉴人类法治文明的有益成果，但绝不能照搬别国模式和做法，绝不能走西方“宪政”“三权鼎立”“司法独立”的路子。\n" +
                "坚持依宪治国、依宪执法，是全面推进依法治国的工作重点。宪法是国家的根本大法是治国安邦的总章程，是党和人民意志的集中体现，具有最高的法律地位、法律权威、法律效力。坚持依法治国首先要坚持依宪治国，坚持依法执政首先要坚持依宪执政。党领导人民制定宪法法律，领导人们实施宪法法律，党自身必须在宪法法律范围内活动。要坚持宪法确定的中国共产党领导地位不动摇。，坚持宪法确定的人民民主专政的国体和人民代表大会制度的政体不动摇。，加强宪法实施和监督。，推进合宪性审查工作，维护宪法权威。\n" +
                "坚持在法制轨道上推进国家治理体系和治理能力现代化，是实现良法善治的必由之路。坚持全面依法治国，是中国特色社会主义国家制度和国家治理体系的显著优势。法治是国家治理体系和治理能力的重要依托。宪法是国家根本大法，是国家制度和法律制度的重要依据。通过宪法法律确认和巩固国家根本制度、基本制度、重要制度，并运用国家强制力保证实施，保障了国家治理体系的系统性、规范性、协调性、稳定性。实现国家治理现代化，必须推进国家治理的制度化、程序化、法治化，在宪法范围内和法制轨道上，推进国家治理体系和治理能力现代化，充分实现国家和社会治理的有法可依、有法必依、执法必严、违法必究。\n" +
                "坚持建设中国特色社会主义法治体系，是全面推进依法治国的发展目标和总抓手。依法治国各项工作都要围绕这个总抓手来谋划、推进。必须抓住建设中国特色社会主义法治体系这个总抓手，努力形成完备的法律规范体系、高效的法治实施体系。充分发挥依法治国和依法治党的互补性作用。确保党纪依据宪法法律治国理政，又根据党内法规管党制党、从严治党。坚持依法治国和以德治国相结合，法案天下，德润民心，实现法治和德治相辅相成、相得益彰。\n" +
                "坚持依法治国、依法执政、依法行政共同推进。，法制国家、法制政府、法制社会一体建设，是全面推进依法治国的战略布局。全面依法治国是一个系统工程，必须统筹兼顾、把握重点、整体谋划，更加注重系统性、整体性、协同性。依法治国、依法执政、依法行政是一个有机整体。，关键在于党要坚持依法执政、各级政府要坚持依法行政。法制国家、法制政府、法制社会三者各有侧重、相辅相成，法制国家是法制建设的目标。，法治政府是建设法治国家的主体。，法治社会是构筑法治国家的基础。法治政府建设是重点任务和主体工程，要重点推进，率先突破。\n" +
                "坚持全面推进科学立法、严格执法、公正司法、全民守法，是新时代法制建设的“十六字”方针。在全面推进依法治国的工作格局中，科学立法是前提条件，严格执法是关键环节。，公正司法是重要任务。，全民守法是基础工程。开展全面依法治国新征程，要完善中国特色社会主义法律体系，加强重点领域、新兴领域、涉外领域立法，一提高依法行政水平。，完善监察权、审判权、检察权运行和监督机制，促进司法公正，有效发挥法制固根本、稳预期、利长远的保障作用。全面推进依法治国需要全社会共同参与，需要全社会法制观念增强，必须深入开展法制宣传教育。，在全社会弘扬社会主义法治精神，建设社会主义法治文化。\n" +
                "坚持统筹推进国内法制和涉外法制，是建设法治强国的必然要求。法治兴则国兴，法治强则国强。面对世界百年未有之大变局，必须统筹推进国内法制发展和涉外法制建设，积极参与全球治理体系改革和建设。加强涉外法治体系建设，加强国际法运用，维护以联合国为核心的国际体系和以国际法为基础的国际秩序，共同应对全球性挑战。中国走向世界，以负责任大国形象参与国际事务，必须善于运用法治，加强国际法制合作，推动全球治理体系变革，构建人类命运共同体。\n" +
                "坚持建设德才兼备的高素质法制工作队伍，是全面推进依法治国的组织保障。全面推进依法治国，必须着力建设一支忠于党、忠于国家、忠于人民、忠于法律的社会主义法治工作队伍，推进法治专门队伍正规化、专业化、职业化，提高职业素养和专业水平。坚持以德树人，德法兼修，努力培养造就一批高素质法治人才及后备力量。\n" +
                "坚持抓住领导干部这个关键少数，是全面推进依法治国的关键问题。领导干部具体行使党的执政权和国家立法权、行政权、监察权、司法权，是全面依法治国的关键。全面推进依法治国，必须抓住领导干部这个关键少数，不断提高他们运用法制思维和法治方式深化改革、推动发展、化解矛盾、维护稳定的能力，要求他们做尊法学法守法用法的模范。要坚持依法治权，用宪法和法律法律制设定权利、规范权力、制约权利、监督权利，把权力关进法律和制度的笼子里。\n" +
                "二、当前应如何推进法治国家建设？\n" +
                "习近平法治思想是中国特色社会主义法治理论的重大创新发展。习近平法治思想坚持马克思主义立场观点方法，坚持科学社会主义基本原理。，植根于中华优秀传统法律文化和中国法治建设实践，借鉴人类法治文明有益成果，在解决中国法治实践问题的过程中为丰富马克思主义科学体系做出了重大原创性、集成性贡献。习近平法治思想是对马克思主义法治理论的重要思想传承，是中国特色社会主义法治理论的重大创新发展，是习近平新时代中国特色社会主义思想的重要组成部分，是新时代全面依法治国，必须长期坚持的指导思想。\n" +
                "习近平法治思想是党带领人民百年法制实践的重大成就和历史经验总结。党的百年历程是党的百年奋斗史，党的百年奋斗时包括着百年法制是。党的百年法治是是党对马克思主义法治理论的践行史、发展史、深化史。特别是党的十八大以来，以习近平同志为核心的党中央，从关系党和国家前途命运、长治久安的战略全局高度，来定位法治、布局法治、厉行法治，明确将全面依法治国纳入四个全面战略布局予以有力推进，坚持依规治法、形成比较完善的党内法规体系，全面依法治国，在社会主义法治建设史上谱写新篇章。\n" +
                "在习近平法治思想指引下，奋力推进新时代法治中国建设的伟大实践。实践永无止境，理论创新永无止境。习近平总书记强调，必须继续推进马克思主义中国化，坚持把马克思主义基本原理同中国具体实际相结合、同中国优秀传统文化相结合，用马克思主义观察时代、把握时代、引领时代，继续发展当代马克思主义、21世纪马克思主义。因此马克思主义法治理论必须同中国法治实践、同中国优秀传统法律文化相结合，才能形成真正契合中国法治实践需求的法治理论，并使马克思主义法治理论的科学性和真理性在中国得到充分检验，马克思主义法治理论的人民性和实践性在中国得到充分贯彻。，马克思主义法治理论的开放性和时代性在中国得到充分彰显。当代马克思主义法治理论的中国化，必须深深扎根于中国实践，不仅要汲取当代中国法治建设经验，而且要推动中华民族法治文化的当代传承，将马克思主义法治理论与中华优秀传统法律文化有机结合起来。对于中国传统法律思想，要做到取精用宏，继承法意，把握精髓，对其中合理成分加以创造性转化和创新性发展。，由此使中华法系继往开来。这是中华优秀传统法律文化，在新时代重放光彩的现实路径，也是实现中华民族伟大复兴中国梦的题中应有之义。\n" +
                "作为21世纪马克思主义法治理论，习近平法制思想不仅系统阐释了中国特色社会主义法治建设规律、提出了全面依法治国的总目标、总抓手和重点任务。，而且站在世界历史和全球视野的高度。，深刻把握人类政治文明发展趋势，创造性地提出了共商共建共享的全球治理观，为人类法治文明和全球治理体系变革提供了中国方案、贡献了中国智慧。马克思主义法治理论中国化过程，既是对马克思主义法治理论继承、发展和创新的过程，也是着眼世界之问、时代之问，推动马克思主义法治理论不断与时俱进的过程。中华民族伟大的法律传统，给了我们建设现代文明的自信和底气。坚持中国问题、世界眼光，就是在正确认识，并深入分析中国国情的基础上，系统阐释，中华法系和法治文明传统，弘扬中华民族的精神和智慧，正确解读中国现实、总结中国法治经验，创造性地将和平、发展、公平、正义、民主、自由等全人类共同价值融入中国时代需求，深刻回答人类法治进程中的普遍性问题，为世界法制文明进步，提出中国主张，贡献中国方案。\n" +
                "当前，我们已踏上实现第二个百年奋斗目标的伟大新征程。贯彻落实习近平法治思想，就是坚持和发展中国特色社会主义法治理论，坚定不移走中国特色社会主义法治道路。我们要以《习近平法治思想学习纲要》的出版发行为契机，把学习领会《习近平新时代中国特色社会主义思想学习纲要》与《习近平法治思想学习纲要》贯通起来，把党的十九大六中全会关于党的百年历史经验，总结的“十个坚持”与习近平法治思想核心要义的“十一个坚持”贯通起来，结合学习领会《中共中央关于党的百年奋斗重大成就和历史经验的决议》，掀起贯彻落实习近平，法制思想的新高潮。 \n");
        // 进入课程首页
        for (WebElement we : driver.findElements(By.cssSelector("div[class='ouchnPc_index_course_div']"))) {
            String textContent = we.getText();
            System.err.println("text:" + textContent);
            if (textContent.contains(subjectName)) {
                we.findElement(By.tagName("a")).click();
                Thread.sleep(6000);
                break;
            }
        }
        Util.switchToLast(driver);


        // TODO 现在开始获取具体课程所有的答题链接：：

        Map<String, Set<String> >  urlMap = Maps.newHashMap();
        urlMap.put("形势与政策",Sets.newHashSet("https://lms.ouchn.cn/course/10000003958/learning-activity/full-screen#/10000345524"));

        // https://lms.ouchn.cn/course/10000001767/learning-activity/full-screen#/10000213698

        for (String url: urlMap.get(subjectName)) {
            try {
                // 排除不计入考核的作业

                driver.get(url);
               // Thread.sleep(8000);
                Thread.sleep(10000);
                // 点击我的作业
                driver.findElement(By.cssSelector("span[class='tab-title submission-tab left']")).click();
                Thread.sleep(1000);

                // TODO 这里判断是否提交了作业
                boolean isSubmit = false;

                for(WebElement spanWe:driver.findElements(By.cssSelector("span[class^='left submission-score error-tag ng-scope']"))){
                    if("未评分".equals(spanWe.getText())){
                        String completeInfoFilePath = "libs//lmsAnswerInfo//" +teacherName+"//"+ subjectName + "//" + userName + "-practice.txt";
                        File completeInfoFile = new File(completeInfoFilePath);
                        List<CompleteInfo> completeInfoList = Lists.newArrayList();
                        CompleteInfo completeInfo = new CompleteInfo();
                        completeInfo.setHomeworkUrl(url);
                        completeInfo.setComplete(true);
                        completeInfoList.add(completeInfo);
                        FileUtils.write(completeInfoFile, JSONObject.toJSONString(completeInfoList, SerializerFeature.PrettyFormat), "utf-8");
                        log.info("该课程已经评分啦：{}",subjectName);
                        isSubmit = true;
                        break;
                    }
                }

                System.err.println("111111111111111");

                if(isSubmit){
                    continue;
                }

                System.err.println("2222222222222222222");

                // 点击写作业
                for (WebElement spanWe : driver.findElements(By.cssSelector("span[class='ng-scope']"))) {
                    if (spanWe.getText().contains("写作业")) {
                        spanWe.click();
                        Thread.sleep(2000);
                        break;
                    }
                }

                // homework-mode-choice ng-untouched ng-valid select2-offscreen ng-not-empty ng-dirty ng-valid-parse ng-valid-server
//                WebElement selectWe = driver.findElement(By.cssSelector("select[class^='homework-mode-choice']"));
//                Select select = new Select(selectWe);
//                select.selectByIndex(0);

                System.err.println("33333333333333333333");
                Thread.sleep(2000);

                // 找到提交大作业的主界面
              //  WebElement studentWorkAreaWe = driver.findElement(By.cssSelector("div[class='main-area multiple-choice-homework-student-submission']"));
             //   WebElement studentWorkAreaWe = driver.findElement(By.cssSelector("div[class='main-area']"));
                WebElement studentWorkAreaWe = driver.findElement(By.id("submit-popup"));

                System.err.println("444444444444444444");
                // 先点击聚焦 然后发送作业....
                studentWorkAreaWe.findElement(By.cssSelector("div[class='simditor']")).click();
                Thread.sleep(2000);
                String homeWorkAnswers = answers.get(subjectName);
                System.err.println("homeWorkAnswers:"+homeWorkAnswers);
                if(Strings.isNullOrEmpty(homeWorkAnswers)){
                    continue;
                }
                studentWorkAreaWe.findElement(By.cssSelector("div[class='simditor-body needsclick']")).sendKeys(homeWorkAnswers);
                Thread.sleep(2000);
                // 交付作业
                for(WebElement btnWe:driver.findElements(By.tagName("button"))){
                    if(btnWe.getText().contains("交付作业")){
                        btnWe.click();
                        Thread.sleep(2000);
                        break;
                    }
                }


                // 提交答题并确认提交 button button-green ng-scope
               // Thread.sleep(500000);
            } catch (Exception e) {
                e.printStackTrace();
            }

        }
    }




}
